DAY20
今天要來介紹linux 系統當中的netfilter,
它在CentOS 7 之前都是預設的防火牆套件,在CentOS7之後就改由Firewalld 進行防護。
當然CentoS7 當中仍可將iptables裝回來,我們先不談及Firewalld的部分,
因為netfilter的功能非常多,功用不僅限於防火牆而已,
它甚至可以做NAT功能,甚至更多許多網路的服務(例如設備上接雙WAN的設定它都可以做到),
在CentOS6上除了netfilter之外,還有一個防禦機制,它叫做SElinux (安全強化的linux)
它是由美國國安局開放出來放置於其中,它專門針對程序、權限設定做限制,
所以我們在系統上運作的服務,大多要取用系統資源時都得通過這一個關卡,
它的設定方式是透過布林去進行的。
平常在測試機上面運作服務時,我捫會將SElinux關閉在進行,
因為很多時候會因為SElinux的運作造成我捫操作上的不便,
當然到了正式環境時會建議將其打開,
設定的地方在
#vim /etc/sysconfig/selinux //將其中enable 修改成disabled 後再重新開機就不會在啟用了。
若是希望現在就關閉它,可以使用指令
#setenforce 0
要啟用則是將0改成 1
然後再透過指令去確認它現在的運作狀況
#getenforce
關於SElinux操作大概先論述到這裡,
來進入今天的主題netfilter
有在運用linux系統的人對它一定不陌生,我捫許多的存取限制,NAT功能大多都是由它達成的。
在CentoOS6 當中要啟用netfilter很簡單,可以將其當作一個服務來操作就好
#service iptables start
#chkconfig iptables on
在CentOS7版,因為服務都被包進systemctl當中,所以都是透過它進行調整。
#systemctl start iptables
#systemctl enable iptables
netfilter的操作指令是iptables,它可以在我捫的CLI介面直接直行,程序會馬上被套用。
但我捫大多時候是使用shellscript的方式去進行它,
看你是要寫在iptables的設定當中,或者另外寫一個shell出來讓它開機時載入都可以。
我們這邊拿個簡單的範例來說明iptables的防火牆功能。
第一件事要要記住,防火牆規則這種東西,是first match,
也就是說當它比對到相對應的規則後就會直接使用這個規則,不會在管後面到底有沒有甚麼限制。
不管裡面有沒有東西,都先把這邊清空掉。 (關於三個表內容可以詳見鳥哥的操作)
#iptables -F -t filter
#iptables -t filter -X
#iptables -F -t mangle
#iptables -t mangle -X
#iptables -F -t nat
#iptables -t nat -X
lo 通常視本機localhost,所以就直接開放,如此在進行自我的時候比較不會有問題
#iptables -t filter -A INPUT -i lo -j ACCEPT
#iptables -t filter -A OUTPUT -o lo -j ACCEPT
在來這邊就可以稍微解說一下,
-i eth0 表示指定對eth0這張網卡進行篩選,也可以不指定範指全部介面。
-s 表示限制來源端,只限制172.16.100.143
-d 就表示目的地,若netfilter運作在一台伺服器身上,通常指的是自己伺服器本機。
但有時候netfilter會被當成中介的存在,這時候-d是誰就要看怎麼運用了。
-p 表示的是協定,有TCP、UDP、ICMP可以使用,若運用在DNS上就會使用udp
-dport 這邊的dport表示是目標端的port,我們可以將它當成要連接到本機端的port號
-j是說對於以上限制要做甚麼樣的事情,到底是ACCEPT(允許)或者DROP(拋棄)
這邊也有第三個選項REJECT(它也是拋棄的一種,但會跟你說你被我拋棄囉)
這個通常只有在認證考試時用到,沒有人阻擋了別人還跟他說你被我阻擋了吧。
所以下面這個範例就很明白了TCP -22表示的是SSH服務,
只允許192.168.100.250這個IP可以透過SSH服務連結到192.168.100.1的設備。
#iptables -t filter -A INPUT -i eth0 -s 172.16.100.143 -d 172.16.100.144 -p tcp --dport 22 -j ACCEPT
#已連線的封包可以連入
iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#新連線禁止連入
iptables -t filter -A INPUT -m state --state NEW,INVALID -j DROP
這邊就要另外介紹一下 (比較詳細的內容也可以參考鳥哥)
前面這兩個我們會放行的原因,表示說前面我們有放行的的協定,這些是可信任的。
ESTABLISHED:已經連線成功的連線狀態,例如TCP三項交握完成,要開始進行相互資料傳送的封包的階段
RELATED :這個表示連現已經建立,可以開始進行資料的正在進行,但又要創立新的連線資訊。
(這個拿FTP作為例子比較恰當,像是我捫一開始進行FTP連現的時候是用TCP-21,這邊經過連線驗證通過後,可以開始進行指令的傳送,剛好我們要下載資料了,透過TCP-21下達下載的指令,這時候就會開啟新的連線資訊的創建,因為FTP的資料傳送是走TCP-20)
這兩者我們會阻擋的原因是擔心有人惡意進行攻擊,送大量破損的封包來阻礙,或者其他的情形。
INVALID :破損的封包,也就是可能為惡意封包的類型。
NEW :初次要建立連線的封包,例如:TCP三項交握,剛開始SYN的封包類型
(也可能是TIMEOUT要重新連線)
然後最後我們要記得做一件事情,就是如果沒有符合上面規則的,我們通常都是直接DROP掉。
這樣才比較安全。
#iptables -t filter -A INPUT -j DROP
這樣就完成了一個簡單的連線限制了,但是這樣是非常陽春的,它還有很多功能可以去用。
例如限制封包進出量,以其他限制等等。
要查看netfilter目前的運作狀況可以下指令
#service iptables status
#iptables -L -
當然這些設定檔執行的狀況都都可以存log下來。
netfilter的功能真的很多,光這個套件的運用就可以獨立寫成一本書籍了,
有興趣的人可以深入去看看它的操作。